#ifndef __tvectorporo__
#define __tvectorporo__

#include<iostream>
using namespace std;

#include"tporo.h"

/** \file  tvectorporo.h
 *  \brief Esta es una clase basada en la propiedades y operaciones posibles con poros dentro de un vector, utilizando tambien las operaciones posibles de estos.
 *	
 *	Autor: Óscar Toledo Ballester, 48666364c.
 *      Autor: Alejandro Serrano Cases, 74364527f
 *
 * 	Esta clase nos posibilita trabajar con las operaciones de vectores en base a las propiedades de los nueros poros. 	
 */

/** \brief Esta es la clase TVectorPoro con sus metodos.
 *
 *  Aqui tenemos los metodos disponibles para trabajar nuestra clase, múltiples operadores ( suma, resta, corchetes... ), ademas de diferentes metodos de auxiliares como el que nos da el tamaño total y el numero de posiciones ocupadas.
 */

class TVectorPoro
{
		/** \brief Operador << de un vector de poros.
		 *  Este método nos da la posibilidad de mostrar en el formato [(posicion)  (parte real parte imaginaria)] 			 
		 *  \param os El primer parametro sirve para recoger el mensaje a devolver.
		 *  \param v El segundo parametro será nuestro vector a mostrar.
		 *  \return Este metodo nos devolverá un ostream que contendrá el vector con el formato deseado.
		 */
		friend ostream & operator<<(ostream& os,const TVectorPoro& v);

	public:
		/** \brief Constructor por defecto de nuestro vector de poros.
		 *  Crea un vector de poros de tamaño cero.
		 */
		TVectorPoro();
		/** \brief Constructor de nuestra clase TVectorPoro en base a un tamaño.
		 *  Nos crea un vector de poros con el tamaño deseado, si el tamaño es menor o igual que cero el comportamiento será igual al de el 
		 *  constructor por defecto.  			 
		 *  \param n El parametro será el tamaño del vector.
		 */	
		TVectorPoro(int n);
		/** \brief Constructor de copia de nuestra clase TVectorPoro.
		 *  Nos crea un vector de poros en base a otro dado, es decir crea un a copia. 			 
		 *  \param v El parametro será el vector en base al cual queramos generar el nuevo vector.
		 */
		TVectorPoro(const TVectorPoro &);
		/** \brief Destructor nuestra clase.
		 *  Libera la memoria y destruye el vector convirtiendolo en uno de tamaño cero. 			 
		 */
		~TVectorPoro();
		/** \brief Operador de asignación.
		 *  Iguala tanto en orden ,como en contenido, el vector de la izquierda del igual con el de la derecha. 			 
		 *  \param v El parametro será el vector en base al cual queramos igualar al vector. 
		 *  \return Nos devuelve el puntero this que en este caso es el vector de poros que en principio a llamado al metodo pero modificado 			    para ser igual al parametro.
		 */
		TVectorPoro& operator=(const TVectorPoro & v);
		/** \brief Operador de igualdad entre dos vectores de poros.
		 *  Este método compara dos vectores de poros los cuales deben ser exactamente iguales para que dicha comparacion sea cierta. 		
		 *  \param v Vector a comparar.
		 *  \return Este metodo nos devolverá un tipo bool que nos dirá si es cierta o falsa la comparación.
		 */
 		bool operator==(const TVectorPoro & v);
		/** \brief Operador de distinción entre dos vectores de poros.
		 *  Este método compara dos vectores de poros los cuales deben ser distintos para que dicha comparacion sea cierta. 		
		 *  \param v Vector a comparar.
		 *  \return Este metodo nos devolverá un tipo bool que nos dirá si es cierta o falsa la no igualdad.
		 */
		bool operator!=(const TVectorPoro & v);
		/** \brief Operador corchetes izquierda para la clase vector de poros.
		 *  Este metodo nos devuelve el complejo que ocupa la posicion dada como parametro. 		
		 *  Las posiciones dadas empezarán en la posicion 1.
		 *  \param n Posición del vector del cual se desea saber el complejo que la ocupa.
		 *  \return Este metodo devolverá el complejo que ocupa la posicion.
		 */
		TPoro & operator[](int n);
		/** \brief Operador corchetes derecha para la clase vector de poros.
		 *  Este metodo constante nos devuelve el complejo creado en su interior copia del que ocupa la posicion dada como parametro. 
		 *  Las posiciones dadas empezarán en la posicion 1.
		 *  \param n Posición del vector del cual se desea saber el complejo que la ocupa.
		 *  \return Este metodo devolverá una copia del complejo que ocupa la posicion.
		 */
		TPoro  operator[](int n) const;
		/** \brief Tamaño del vector.
		 *  Este metodo calcula el tamaño del vector. 		
		 *  \return Este metodo nos devuelve un entero con el tamaño calculado del vector.
		 */
		int Longitud() const;
		/** \brief Posiciones ocupadas en el vector de poros.
		 *  Nos dice la cantidad de posiciones ocupadas por poros hay en nuestro vector. 		
		 *  \return Este metodo nos devuelve un entero con la cantidad de posiciones ocupadas.
		 */
		int Cantidad() const;
		/** \brief Redimensionar el vector.
		 *  Con este metodo agrandaremos o encojeremos nuestro vector, si lo queremos "recortar" se introducira un entere menor al tamaño actual 			    y los poros despues de este se perderan. 
		 *  Si por el contrario queremos agrandarlo rellenaremos los espacios con poros por defecto.
		 *  \param n Este es el tamaño al que queremos redimensionar el vector.
		 *  \return Este metodo devolverá un booleano, si conseguimos redimensionar tendra el alor true, si, por el contrario, no conseguimos 			    redimensionar devolvera false. .
		 */
		bool Redimensionar(int n);
		
		void SetLongitud(int n);

	private:
		/** \brief Declaracion de la variable que apunta al TComplejo.
		 * Este será el puntero que apuntará los comlpejos. 
		 */
		TPoro *datos;
		/** \brief Declaracion de la variable TComplejo error.
		 * TComplejo creado por defecto que servira para ser devuelto cuando ocurra un error en ciertos metodos.
		 */
		TPoro error;
		/** \brief Declaracion de la variable int del Tamaño.
		 * Esta variable nos dice el tamaño que tiene nuestro vector.
		 */
		int dimension;
	
	friend class TPoro;

};

#endif
